package com.projetosi.web.server.sistema.dao;

import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import com.projetosi.web.server.sistema.interfaces.IGenericDAO;
import com.projetosi.web.server.sistema.interfaces.IGenericObject;
import com.projetosi.web.server.sistema.objetos.Emprestimo;
import com.projetosi.web.server.sistema.persistencia.LerEscreveArquivo;
import com.projetosi.web.server.sistema.sistema.RepositorioDeDados;

/**
 * 
 * @author  Filipe Alencar, Felipe J. Cavalcanti, Rodrigo L. de Brito, Thiago Goncalves, Victor Hugo Arcelino.
 *
 */

public class EmprestimoDAO implements IGenericDAO {

	private static RepositorioDeDados _repositorio = RepositorioDeDados.getInstance();
	File arquivo = new File("emprestimos.xml");

	/**
	 * Cadastra um novo emprestimo no sistema.
	 * @throws Exception 
	 */
	@Override
	public void cadastrar(IGenericObject objeto) throws Exception {
		if(objeto instanceof Emprestimo){
			Emprestimo emprestimo = (Emprestimo) objeto;
			if(!LerEscreveArquivo.existeXml(arquivo)){
				_repositorio.getEmprestimos().add(emprestimo);
                _repositorio.atualizarDados(arquivo);
			}else{
				List<Emprestimo> emprestimos = _repositorio.carregarDados(arquivo);
				emprestimos.add(emprestimo);
				_repositorio.atualizarDados(arquivo);
			}
			
		}
	}

	
	/**
	 * Atualiza um emprestimo que foi alterado no repositorio de dados.
	 * @throws Exception 
	 */
	@Override
	public void alterar(IGenericObject objeto) throws Exception {
		List<Emprestimo> emprestimosCadastrados = null;
		if(objeto instanceof Emprestimo){
			Emprestimo emprestimoAlterado = (Emprestimo) objeto;
			if(!LerEscreveArquivo.existeXml(arquivo)){
				emprestimosCadastrados = _repositorio.getEmprestimos();
			}else{
				emprestimosCadastrados = _repositorio.carregarDados(arquivo);
			}
			for (int i = 0; i < emprestimosCadastrados.size(); i++) {
				if(emprestimosCadastrados.get(i).equals(emprestimoAlterado)){
					emprestimosCadastrados.set(i, emprestimoAlterado);
					_repositorio.setEmprestimos(emprestimosCadastrados);
					_repositorio.atualizarDados(arquivo);
				}
			}
			
		}
			
	}

	
	/**
	 * Deleta um emprestimo do sistema.
	 * @throws Exception 
	 */
	@Override
	public void deletar(IGenericObject objeto) throws Exception {
		List<Emprestimo> emprestimosCadastrados = null;
		if(objeto instanceof Emprestimo){
			Emprestimo emprestimoADeletar = (Emprestimo) objeto;
			if(!LerEscreveArquivo.existeXml(arquivo)){
				emprestimosCadastrados = _repositorio.getEmprestimos();
			}else{
				emprestimosCadastrados = _repositorio.carregarDados(arquivo);
			}
			for(Iterator<Emprestimo> it = emprestimosCadastrados.iterator(); it.hasNext();){
				Emprestimo emprestimo = it.next();
				if(emprestimo.equals(emprestimoADeletar)){
					it.remove();
					_repositorio.setEmprestimos(emprestimosCadastrados);
					_repositorio.atualizarDados(arquivo);
					return;
				}
			}

		}	
	}

	/**
	 * Pesquisa um certo emprestimo(s) cadastrado(s) no sistema,a partir de uma certa chave.
	 *  @return Lista contendo os emprestimos pesquisados
	 */
	@Override
	public List<IGenericObject> pesquisar(String filtro, String chave)
			throws Exception {
		if(filtro == null || chave == null){
			throw new Exception("Especifique o filtro e a chave da pesquisa.");
		}
		if(filtro.trim().isEmpty() || chave.trim().isEmpty()){
			throw new Exception("Voce deve deve definir o filtro e a chave da pesquisa.");
		}
		if(filtro.equals("idRequisicaoEmprestimo")){
			return pesquisarPorIdRequisicaoEmprestimo(Integer.parseInt(chave));
		}
		if(filtro.equals("idEmprestimo")){
			return pesquisarPorIdEmprestimo(Integer.parseInt(chave));
		}
		return pesquisarTodos();
	}
	
	/**
	 * Pesquisa um emprestimo pelo seu id de requisicao.
	 * @param id O id de requisicao do emprestimo.
	 * @return Uma lista contendo o emprestimo pesquisado.
	 * @throws Exception 
	 */
	private List<IGenericObject> pesquisarPorIdRequisicaoEmprestimo(int id) throws Exception{
		List<IGenericObject> emprestimosCadastrados = pesquisarTodos();
		List<IGenericObject> resultado = new ArrayList<IGenericObject>();
		for (IGenericObject emprestimo : emprestimosCadastrados) {
			if(((Emprestimo)emprestimo).getIdRequisicaoEmprestimo() == id){
				resultado.add(emprestimo);
			}
		}
		return resultado;
	}
	
	/**
	 * Pesquisa um emprestimo pelo seu id (gerado no momento que o emprestimo e aprovado)
	 * @param id O id do emprestimo.
	 * @return Uma lista contendo o emprestimo pesquisado.
	 * @throws Exception 
	 */
	private List<IGenericObject> pesquisarPorIdEmprestimo(int id) throws Exception{
		List<IGenericObject> emprestimosCadastrados = pesquisarTodos();
		List<IGenericObject> resultado = new ArrayList<IGenericObject>();
		for (IGenericObject emprestimo : emprestimosCadastrados) {
			if(((Emprestimo)emprestimo).getIdEmprestimo() == id){
				resultado.add(emprestimo);
			}
		}
		return resultado;
	}

	/**
	 * Pesquisa por todos os emprestimos cadastrados no sistema.
	 * @return Lista contendo todos os emprestimos cadastrados no sistema.
	 * @throws Exception 
	 */
	@Override
	public List<IGenericObject> pesquisarTodos() throws Exception {
		List<Emprestimo> emprestimosCadastrados = null;
		List<IGenericObject> resultado = new ArrayList<IGenericObject>();
		if(!LerEscreveArquivo.existeXml(arquivo)){
			emprestimosCadastrados = _repositorio.getEmprestimos();
		}else{
			emprestimosCadastrados = _repositorio.carregarDados(arquivo);
		}
		for (Emprestimo emprestimo : emprestimosCadastrados) {
			if(emprestimo instanceof Emprestimo){
				resultado.add(emprestimo);
			}
		}
		return resultado;
	}
	
	
}
